package com.yunwushanhe.document.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yunwushanhe.document.entity.File;
import com.yunwushanhe.document.mapper.FileMapper;
import com.yunwushanhe.document.service.IFileService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yunwushanhe.document.utils.PageUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 云雾山河
 * @since 2022-10-24
 */
@Slf4j
@Service
public class FileServiceImpl extends ServiceImpl<FileMapper, File> implements IFileService {
    @Autowired
    FileMapper fileMapper;
    @Autowired
    PageUtils pageUtils;

    @Override
    public int insert(File file) {
        int insertResult = fileMapper.insert(file);
        log.info("insert 之后返回的数值 = {}",insertResult);
        return insertResult;
    }

    /**
     * 删除文件以及顶层的文件夹来使用
     * @param id
     * @return
     */
    @Override
    public int deleteById(int id) {
        return fileMapper.deleteById(id);
    }

    /**
     * 删除文件夹使用，根据文件路径来模糊删除
     * @param filePath
     * @return
     */
    @Override
    public int deleteFolderContentsVague(String filePath,String fileOfUserNumber) {
        LambdaQueryWrapper<File> wrapper = new LambdaQueryWrapper<>();
        wrapper.likeRight(Strings.isNotEmpty(filePath),File::getFilePath,filePath);
        wrapper.eq(Strings.isNotEmpty(filePath),File::getFileOfUserNumber,fileOfUserNumber);
        return fileMapper.delete(wrapper);
    }

    /**
     * 正式用于重命名文件名
     * @param file
     * @return
     */
    @Override
    public int updateFilename(File file,String fileOfUserNumber) {
        String path = file.getFilePath()+file.getFilename()+"/";
        QueryWrapper<File> wrapper01 = new QueryWrapper<>();
        wrapper01.likeRight("file_path",path);
        wrapper01.eq("file_of_user_number",fileOfUserNumber);
        List<File> fileList = fileMapper.selectList(wrapper01);
        log.info("<--================={}==================-->",fileList.size());
        if(!fileList.isEmpty() && file.getFileJudge()==1){
            for (File file1 : fileList) {
                QueryWrapper<File> wrapper02 = new QueryWrapper<>();
                String pathForward = file1.getFilePath().substring(0, file.getFilePath().length());
                String pathNext = file1.getFilePath().substring(path.length()-1);
                String newPath = pathForward+file.getNewFilename()+pathNext;
                log.info("<--================={}==================-->",newPath+file1.getFilename());
                wrapper02.eq("filename",file1.getFilename());
                wrapper02.eq("file_path",file1.getFilePath());
                wrapper02.eq("file_of_user_number",fileOfUserNumber);
                file1.setFilePath(newPath);
                fileMapper.update(file1, wrapper02);
            }
        }
        QueryWrapper<File> wrapper = new QueryWrapper<>();
        wrapper.eq("filename",file.getFilename());
        wrapper.eq("file_path",file.getFilePath());
        wrapper.eq("file_of_user_number",fileOfUserNumber);
        String newFilename = file.getNewFilename();
        file.setFilename(newFilename);
        return fileMapper.update(file, wrapper);
    }



    /**
     * 本质上是查询 file_path 满足一定条件的文件或者文件夹，并非模糊查询
     * 可用与判断当前文件夹里面是否有文件
     * @param filePath
     * @param filename
     * @return
     */
    @Override
    public List<File> select(String filePath,String filename,String fileOfUserNumber) {
        QueryWrapper<File> wrapper = new QueryWrapper<>();
        wrapper.eq("file_path",filePath+filename+"/");
        wrapper.eq("file_of_user_number",fileOfUserNumber);
        List<File> fileList = fileMapper.selectList(wrapper);
        return fileList;
    }

    @Override
    public File selectByFilePathAndFilename(String filePath, String filename, String fileOfUserNumber) {
        QueryWrapper<File> wrapper = new QueryWrapper<>();
        wrapper.eq("file_path",filePath);
        wrapper.eq("filename",filename);
        wrapper.eq("file_of_user_number",fileOfUserNumber);
        File file = fileMapper.selectOne(wrapper);
        return file;
    }

    /**
     * 根据id查询文件
     * @param id
     * @return
     */
    @Override
    public File selectById(int id) {
        return fileMapper.selectById(id);
    }

    /**
     * 用于重命名文件的前期查询
     * @param id
     * @return
     */
    @Override
    public File renameSelect(int id) {
        QueryWrapper<File> wrapper = new QueryWrapper<>();
        wrapper.eq("id",id);
        return fileMapper.selectOne(wrapper);
    }

    //这两个方法已经没用了
    @Override
    public IPage<File> getPage(int currentPage, int pageSize) {
        Page page = fileMapper.selectPage(new Page(currentPage, pageSize), null);
        return page;
    }

    //这两个方法已经没用了
    @Override
    public IPage<File> getPage(int currentPage, int pageSize, File file) {
        QueryWrapper<File> wrapper = new QueryWrapper<>();
        wrapper.eq("file_path",file.getFilePath());
        /*LambdaQueryWrapper<File> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(Strings.isNotEmpty(file.getFilePath()),File::getFilePath,file.getFilePath());*/
        return fileMapper.selectPage(new Page(currentPage,pageSize),wrapper);
    }

    @Override
    public List<File> queryVagueByFilePath(String filePath,String fileOfUserNumber) {
        QueryWrapper<File> wrapper = new QueryWrapper<>();
        wrapper.likeRight("file_path",filePath);
        wrapper.eq("file_of_user_number",fileOfUserNumber);
        return fileMapper.selectList(wrapper);
    }

    @Override
    public PageUtils getFilePage(int currentPage, int pageSize, String filePath, String fileOfUserNumber) {
        List<File> filePage = fileMapper.getFilePage((currentPage-1) * pageSize, pageSize, filePath,fileOfUserNumber);
        Integer total = fileMapper.getTotal(filePath,fileOfUserNumber);
        if(total%pageSize!=0){
            pageUtils.setPages(total/pageSize+1);
        } else {
            //该这里
            pageUtils.setPages(total/pageSize==0?1:total/pageSize);
        }
        //如果当前页码值大于总页码值，那么重新执行查询操作
        if(currentPage > pageUtils.getPages()){
            //当没有查询到数据的时候，pageUtils.getPages()得到的结果应该为0，0-1为-1，会报错
            filePage = fileMapper.getFilePage((pageUtils.getPages()-1) * pageSize, pageSize, filePath,fileOfUserNumber);
        }
        pageUtils.setCurrent(currentPage);
        pageUtils.setSize(pageSize);
        pageUtils.setTotal(total);
        pageUtils.setRecords(filePage);
        return pageUtils;
    }

    @Override
    public PageUtils getFilePageTwo(int currentPage, int pageSize, String filePath, String fileOfUserNumber) {
        List<File> filePage = fileMapper.getFilePageTwo((currentPage-1) * pageSize, pageSize, filePath, fileOfUserNumber);
        Integer total = fileMapper.getTotalTwo(filePath, fileOfUserNumber);
        if(total%pageSize!=0){
            pageUtils.setPages(total/pageSize+1);
        } else {
            //该这里
            pageUtils.setPages(total/pageSize==0?1:total/pageSize);
        }
        //如果当前页码值大于总页码值，那么重新执行查询操作
        if(currentPage > pageUtils.getPages()){
            //当没有查询到数据的时候，pageUtils.getPages()得到的结果应该为0，0-1为-1，会报错
            filePage = fileMapper.getFilePageTwo((pageUtils.getPages()-1) * pageSize, pageSize, filePath, fileOfUserNumber);
        }
        pageUtils.setCurrent(currentPage);
        pageUtils.setSize(pageSize);
        pageUtils.setTotal(total);
        pageUtils.setRecords(filePage);
        return pageUtils;
    }

    /**
     * 用于实现根据文件名模糊查询的功能
     * @param currentPage
     * @param pageSize
     * @param filename
     * @param fileOfUserNumber
     * @return
     */
    @Override
    public PageUtils getFilePageVague(int currentPage, int pageSize, String filename, String fileOfUserNumber) {
        List<File> filePage = fileMapper.getFilePageVague((currentPage-1) * pageSize, pageSize, "%"+filename+"%",fileOfUserNumber);
        Integer total = fileMapper.getTotalVague("%"+filename+"%",fileOfUserNumber);
        if(total%pageSize!=0){
            pageUtils.setPages(total/pageSize+1);
        } else {
            //该这里
            pageUtils.setPages(total/pageSize==0?1:total/pageSize);
        }
        //如果当前页码值大于总页码值，那么重新执行查询操作
        if(currentPage > pageUtils.getPages()){
            //当没有查询到数据的时候，pageUtils.getPages()得到的结果应该为0，0-1为-1，会报错
            filePage = fileMapper.getFilePageVague((pageUtils.getPages()-1) * pageSize, pageSize, "%"+filename+"%",fileOfUserNumber);
        }
        pageUtils.setCurrent(currentPage);
        pageUtils.setSize(pageSize);
        pageUtils.setTotal(total);
        pageUtils.setRecords(filePage);
        return pageUtils;
    }

    /**
     * 用于复制和移动时对数据库的插入操作，这个功能中包含一定的业务逻辑代码
     * @param copyOrRemoveFile
     * @param targetFile
     * @param fileList
     */
    @Override
    public void copyOrRemoveInsert(File copyOrRemoveFile,File targetFile,List<File> fileList){
        String targetFilePath = targetFile.getFilePath() + targetFile.getFilename() + "/";
        if(copyOrRemoveFile.getFileJudge()!=1){//复制的是文件
            copyOrRemoveFile.setFilePath(targetFilePath);
            fileMapper.insert(copyOrRemoveFile);
        }else{//复制的是文件夹
            if(fileList.isEmpty()){//移动的是空文件夹
                copyOrRemoveFile.setFilePath(targetFilePath);
                fileMapper.insert(copyOrRemoveFile);
            }else{
                int length = copyOrRemoveFile.getFilePath().length();
                copyOrRemoveFile.setFilePath(targetFilePath);
                fileMapper.insert(copyOrRemoveFile);//这里把顶层的copyFile文件的路径改了在增加到数据库中，先把顶层文件插进去
                for (File file : fileList) {//这些都针对copyFile中的子文件或者文件夹的
                    String interceptPath = file.getFilePath().substring(length);
                    file.setFilePath(targetFilePath+interceptPath);
                    fileMapper.insert(file);
                }
            }
        }
    }
}
